/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sgs.fachada;

import br.com.sgs.auxiliar.SolicitacaoAux;
import br.com.sgs.dao.DAOSolicitacao;
import br.com.sgs.dao.IDAOSolicitacao;
import br.com.sgs.entity.*;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

/*
 *
 * @author Eric
 */
public class SolicitacaoFachada extends Fachada implements SolicitacaoIFachada {
    
    @Override
    public Solicitacao findSolicitacaoById(int idsolicitacao) {
        IDAOSolicitacao dao = new DAOSolicitacao();
        return dao.findSolicitacaoById(idsolicitacao);
    }

    @Override
    public List<Solicitacao> findSolicitacao() {
        IDAOSolicitacao dao = new DAOSolicitacao();
        return dao.findSolicitacao();
    }

    @Override
      public List<Solicitacao> findSolicitacaoByAll(String descricao, Date dtcriacaoini, Date dtcriacaofin, List<String> lsstatus, int idaluno, Departamento departamento) {
        IDAOSolicitacao dao = new DAOSolicitacao();
        return dao.findSolicitacaoByAll(descricao, dtcriacaoini, dtcriacaofin, lsstatus, idaluno, departamento);
    }
    
    @Override
    public void inserir(Object o) throws ClassNotFoundException, SQLException, Exception {

        Solicitacao solicitacao = (Solicitacao) o;
        
        
        if (!solicitacao.getModeloSolicitacao().getLsetapa().isEmpty() && !solicitacao.getModeloSolicitacao().getLsetapa().get(0).getLsprocesso().isEmpty()) {
            solicitacao.setEtapaatual(solicitacao.getModeloSolicitacao().getLsetapa().get(0));
            solicitacao.setProcessoAtual(solicitacao.getModeloSolicitacao().getLsetapa().get(0).getLsprocesso().get(0));
        }
        
        super.inserir(solicitacao);

    }

    @Override
    public void proximoProcesso(Solicitacao solicitacao) {
        try {
            
            boolean isproximo = false;
            List<Processo> processos = solicitacao.getEtapaatual().getLsprocesso();
            
 
            if (!processos.isEmpty() && processos.get(processos.size() - 1).equals(solicitacao.getProcessoAtual())) {
                proximaEtapa(solicitacao);
            } else {

                for (Processo p : processos) {

                    if (isproximo) {
                        solicitacao.setProcessoAtual(p);
                        super.alterar(solicitacao);
                        break;
                    }

                    if (p.equals(solicitacao.getProcessoAtual())) {
                        isproximo = Boolean.TRUE;
                    }
                }
            }

        } catch (Exception e) {
            System.err.println("Erro no avancarProcesso");
            e.printStackTrace();
        }
    }
    
    
    public void proximaEtapa(Solicitacao solicitacao){
        try {
            boolean isproximo = false;
            List<Etapa> etapas = solicitacao.getModeloSolicitacao().getLsetapa();
            
            if (!etapas.isEmpty() && etapas.get(etapas.size() - 1).equals(solicitacao.getEtapaatual())) {
                solicitacao.setStatus(SolicitacaoAux.CONCLUIDA);
                super.alterar(solicitacao);
                 
            } else {

                for (Etapa etapa : etapas) {

                    if (isproximo) {

                        if (solicitacao.getEtapaatual().getDepartamento() != etapa.getDepartamento()) {
                            solicitacao.setFuncionario(null);
                        }
                        
                        solicitacao.setEtapaatual(etapa);
                        solicitacao.setProcessoAtual(etapa.getLsprocesso().get(0));
                        super.alterar(solicitacao);
                        break;
                    }

                    if (etapa.equals(solicitacao.getEtapaatual())) {
                        isproximo = Boolean.TRUE;
                    }
                }
            }
           
        } catch (Exception e) {
            System.err.println("Erro no proximaEtapa");
        }
        }
    }
